package part9

import (
	"crypto/rand"
	"fmt"
	"math/big"
)

// 验证器结构体
type Validator struct {
	Address string   // 验证器地址
	Stake   int64    // 抵押金额
	Random  *big.Int // 随机数
}

// 生成随机数
func GenerateRandom() *big.Int {
	randBytes := make([]byte, 32)
	_, err := rand.Read(randBytes)
	if err != nil {
		panic(err)
	}
	return new(big.Int).SetBytes(randBytes)
}

// 选择下一个出块的验证器
func ChooseValidator(validators []*Validator, timestamp int64) *Validator {
	// 计算验证器权重和总权重
	totalStake := int64(0)
	for _, v := range validators {
		totalStake += v.Stake
	}

	// 计算随机数的哈希值，并根据哈希值计算验证器的选择概率
	random := GenerateRandom()
	fmt.Printf("random: %v\n", random)
	hash := new(big.Int).Exp(random, big.NewInt(timestamp), nil)
	selectedStake := new(big.Int).Mod(hash, big.NewInt(totalStake)).Int64()

	// 根据选择概率选出下一个出块的验证器
	for _, v := range validators {
		selectedStake -= v.Stake
		if selectedStake <= 0 {
			return v
		}
	}
	return nil
}
